package utils

import (
	"fmt"
	"time"
)

// 日期格式常量
const (
	YYYY                = "2006"
	YYYY_MM             = "2006-01"
	YYYY_MM_DD          = "2006-01-02"
	YYYYMMDDHHMMSS      = "20060102150405"
	YYYY_MM_DD_HH_MM_SS = "2006-01-02 15:04:05"
)

// 获取当前时间
func GetNowDate() time.Time {
	return time.Now()
}

// 获取当前日期，格式为 yyyy-MM-dd
func GetDate() string {
	return DateTimeNow(YYYY_MM_DD)
}

// 获取当前时间，格式为 yyyy-MM-dd HH:mm:ss
func GetTime() string {
	return DateTimeNow(YYYY_MM_DD_HH_MM_SS)
}

// 获取当前时间，格式为 yyyyMMddHHmmss
func DateTimeNowDefault() string {
	return DateTimeNow(YYYYMMDDHHMMSS)
}

// 根据指定格式获取当前时间
func DateTimeNow(format string) string {
	return time.Now().Format(format)
}

// 将时间对象格式化为字符串
func ParseDateToStr(format string, date time.Time) string {
	return date.Format(format)
}

// 将字符串解析为时间对象
func ParseStrToDate(format, str string) (time.Time, error) {
	return time.Parse(format, str)
}

// 获取日期路径，格式为 yyyy/MM/dd
func DatePath() string {
	return time.Now().Format("2006/01/02")
}

// 获取日期字符串，格式为 yyyyMMdd
func DateTime() string {
	return time.Now().Format("20060102")
}

// 解析字符串为日期对象，支持多种格式
func ParseDate(str string, patterns []string) (time.Time, error) {
	var parsedTime time.Time
	var err error
	for _, pattern := range patterns {
		parsedTime, err = time.Parse(pattern, str)
		if err == nil {
			return parsedTime, nil
		}
	}
	return parsedTime, fmt.Errorf("unable to parse date: %s", str)
}

// 获取服务器启动时间
func GetServerStartDate() time.Time {
	return time.UnixMilli(int64(time.Now().UnixMilli() - time.Since(time.Now()).Milliseconds()))
}

// 计算两个日期之间的天数差
func DifferentDaysByMillisecond(date1, date2 time.Time) int {
	return int(date2.Sub(date1).Hours() / 24)
}

// 计算时间差，返回格式化的字符串
func TimeDistance(endDate, startDate time.Time) string {
	diff := endDate.Sub(startDate)
	day := diff / (24 * time.Hour)
	hour := (diff % (24 * time.Hour)) / time.Hour
	min := (diff % time.Hour) / time.Minute
	return fmt.Sprintf("%d天%d小时%d分钟", day, hour, min)
}

// LocalDateTime 转 Date
func ToDateFromLocalDateTime(localDateTime time.Time) time.Time {
	return localDateTime
}

// LocalDate 转 Date
func ToDateFromLocalDate(localDate time.Time) time.Time {
	return time.Date(localDate.Year(), localDate.Month(), localDate.Day(), 0, 0, 0, 0, localDate.Location())
}
